package com.zf.mapstruct.converter;

import com.zf.mapstruct.entity.CustomerInfo;
import com.zf.mapstruct.entity.StudentInfo;
import com.zf.mapstruct.entity.UserInfo;
import com.zf.mapstruct.vo.MultiEntityVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingConstants;

/**
 * MAPSTRUCT映射器，自动生成实现类，根据getter,setter方法设置属性。
 * 若指定(componentModel = MappingConstants.ComponentModel.SPRING)则会作为bean注入到spring容器中,
 * 默认情况下需要通过 Mappers.getMapper(Mapper.Class) 获取实例
 * 直接注入使用即可
 */
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface MultiObjConverter {

    /**
     * 多个对象合并到一个结果中，如果对象中的属性重复，则必须指明使用的是哪个对象，
     * 其他不重名的对象会自动根据数据名，从对应的对象中的取值
     */
    @Mapping(source = "userId", target = "userId") // UserInfo也有userId, 如果指定"userId"则优先使用方法的参数中的userId，否者使用UserInfo中的userId
    @Mapping(source = "userInfo.username", target = "username") // 指定使用哪个对象的属性
    @Mapping(source = "userInfo.age", target = "age") // 指定使用哪个对象的属性
    @Mapping(source = "customerInfo", target = ".") // 使用 . 将属性的值展开到目标对象的同名属性中，如果和其他对象有相同的属性名，则还是需要指定具体使用哪个对象
    @Mapping(source = "studentInfo.gender", target = "gender") // 指定使用哪个对象的属性
    MultiEntityVO toMulti(UserInfo userInfo, StudentInfo studentInfo, Long userId, CustomerInfo customerInfo);
}
